iT邦幫忙

DAY 4
0

30 天學會 Web 前端效能優化系列 第 4

[30 天學會 Web 前端效能優化] 4. TCP 三向交握

  • 分享至 

  • xImage
  •  

TCP 為連線導向的傳輸協定,因此雙方正式傳輸資料前,必須先經過三向交握(Three Way Handshake)這個階段,達成連線協議。

整個流程如果用圖表示的話就是這樣:

一開始 clinet 送了一個同步封包(SYN1)給 server ,請求進行連線。送出的資訊中,最重要的有以下幾個(TCP 封包都有這幾個資訊):

  1. Port : 來源主機以及目的主機的 port number。
  2. Sequence Number:client 隨機選取的初始序號1(Sequence Number1, 我們簡稱 Seq1),用來與 server 達到同步作用。
  3. Acknowledge Number:第一個步驟,才剛請求建立連線而已,不會有確認號碼,因此這邊暫時全部填0。
  4. TCP 封包中 flags(6 bits) 裡面的 Synchronize 位元:這個位元會被設定成1,表示這個封包是送出 SYN 的資訊。
  5. 可接受的 Window Size :設定 client 自己可接受的 Window Size 大小,告知 server 自己可以承受的程度。

以下為 flags 全部 6 個位元(bit)的內容,請注意被上了紅色的 Synchronize 以及 Acknowledge 這兩個 bit ,Synchronize 用來告知這個封包是送出 SYN 資訊,而 Acknowledge 則是用來告知這個封包是送出 ACK 資訊:

當 server 接到從 client 而來的 SYN1 封包後,它就會回傳包括以下資訊的封包(SYN2+ACK1):

  1. Port : 來源主機以及目的主機的 port number。
  2. Sequence Number:server 隨機選取的初始序號2(Sequence Number2, 我們簡稱 Seq2),用來與 client 達到同步作用。
  3. Acknowledge Number:此為第一階段 client 產生的初始序號 Seq1 + 1,用來告知 client 已經收到了 SYN1 這個封包,並且希望下次 client 送來的封包序號為 Seq1+1。
  4. TCP 封包中 flags(6 bits) 裡面的 Synchronize 位元:設成1,有 SYN 資訊。
  5. TCP 封包中 flags(6 bits) 裡面的 Acknowledge 位元:設成1,有 ACK 資訊。
  6. 可接受的 Window Size :設定 server 自己可接受的 Window Size 大小,告知 client 自己可以承受的程度。

第三階段,client 收到了上面的封包後,就會回傳包括以下資訊的封包(ACK2):

  1. Port : 來源主機以及目的主機的 port number。
  2. Sequence Number:Seq1 + 1。
  3. Acknowledge Number:Seq2 + 1 ,用來告訴 server 自己已經收到了 SYN2,也希望下次 server 給的封包序號是 Seq2 + 1。
  4. TCP 封包中 flags(6 bits) 裡面的 Acknowledge 位元:設成1,有 ACK 資訊。
  5. 可接受的 Window Size :設定 client 自己可接受的 Window Size 大小,告知 server 自己可以承受的程度。

經過上述三個步驟後,「建立連線」階段結束,雙方就會開始傳輸資料。第一以及第二步驟如果遺失的話,整個步驟就必須重新來過。

結合前一篇以及這篇文章,想必你對於 TCP 做了什麼事情有更深的了解了吧?我們只講了 TCP 裡面兩個重要的概念而已,因此或許你還是會有些疑惑,不過這不是重點,之所以介紹這兩個東西,是要讓各位感受一下 TCP 傳輸過程經過了多少步驟、背後做了多少事,使各位擁有更確實的概念。


上一篇
[30 天學會 Web 前端效能優化] 3. TCP 的確認機制
下一篇
[30 天學會 Web 前端效能優化] 5. 淺談 HTTP 協定
系列文
30 天學會 Web 前端效能優化30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
pantc328
iT邦高手 1 級 ‧ 2014-09-19 11:25:11

看不懂什麼叫做很慢??

一般寫網頁,寫Web都不是TCP在慢
都是自己的Code,自己的架構在慢
TCP慢你也沒辦法,除非你有辦法寫網路層,傳輸層,數據連接層,實體層的架構

所謂的慢要有依據
如果你跟UDP比較的話
TCP相對的是慢

0
kevin3372000
iT邦新手 3 級 ‧ 2014-09-19 13:02:00

我是指跟 UDP 比,謝謝你,我把它描述清楚

0
pantc328
iT邦高手 1 級 ‧ 2014-09-19 17:25:43

TCP 跟 UDP 在 Transport Layer 下四層是一樣快的
取決你的傳輸通道跟媒介
網路業者給你20M就是20M

TCP 跟 UDP 在OSI 上面三層就差很多
TCP 會有重傳,同步,偵錯…行為
所以你的資料加Protocol meta 資料,還有一些協定封包...會多站很多頻寬

UDP看似很快,但使用上可不一定.因為他功能很少,所以你一些機制要寫在Session 之上去確認資料可用性,還有怎麼對話…
你寫得不好,寫得比TCP複雜...應用上可能會比TCP慢

0
kevin3372000
iT邦新手 3 級 ‧ 2014-09-19 17:41:44

的確,這樣比較是有些不妥,畢竟應用不太相同

0
kevin3372000
iT邦新手 3 級 ‧ 2014-09-19 17:46:24

果然鐵人賽獲益最多的是自己啊~~ 感謝您~

講了很多我沒想到的點~~

我要留言

立即登入留言